/*
 * DMA.c
 *
 *  Created on: 2021年2月22日
 *      Author: 78677
 */

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"

void DMA_CH1_Init(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source){
    int i;
    EALLOW;
    // 开启外设时钟
    SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
    // 高速外围时钟预定标器 150/(2*3) = 25MHz
    // 因为ADC达不到150MHz
    DELAY_US(1000);
    SysCtrlRegs.HISPCP.all = 3;

    EDIS;
    // ADC 校准   汇编程序
    InitAdc();
    // 采样时间选择
    AdcRegs.ADCTRL1.bit.ACQ_PS = 0xf;
    // 对HISPCP在进行分频
    AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x1;
    // 级联模式：不使用级联
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;
    // SEQ1 中断使能
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1;
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;
    //ADC 输入通道选择为通道0
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
    // 不开启连续运行状态，手动进行adc转换
    //AdcRegs.ADCTRL1.bit.CONT_RUN = 1;
    AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; // Start SEQ1
    /***************  DMA初始化   ***********************/
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1;
    EDIS;
    // dma 初始化
    DMAInitialize();
    // dma 转移地址配置  DMA_Dest：目的地   DMA_Source：来源
    DMACH1AddrConfig(DMA_Dest, DMA_Source);
    DMACH1BurstConfig(0, 0, 0);
    DMACH1TransferConfig(9, 0, 0);
    DMACH1WrapConfig(1, 0, 0, 1);
    DMACH1ModeConfig(DMA_SEQ1INT, PERINT_ENABLE, ONESHOT_DISABLE,
                     CONT_DISABLE, SYNC_DISABLE, SYNC_SRC, OVRFLOW_DISABLE,
                     SIXTEEN_BIT, CHINT_END, CHINT_ENABLE);
    StartDMACH1();
    // 软件开启转换
    AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
    for(i=0;i<10;i++)
    {
         DELAY_US(1000);
         AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
    }
}



volatile Uint16 *DMADest;
volatile Uint16 *DMASource;

Uint16 ADC_Value[20];

__interrupt void DMA_CH1_Interrupt(){
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP7;  // 第7组中断响应
}

void main(void){
    int i,j;

    InitSysCtrl();
    DINT;
    InitPieCtrl();
    InitPieVectTable();
    IER = 0x0000;
    IFR = 0x0000;
    EALLOW;
    PieVectTable.DINTCH1 = &DMA_CH1_Interrupt;
    EDIS;

    PieCtrlRegs.PIEIER7.bit.INTx1 = 1;
    IER |= M_INT7;
    EnableInterrupts();
    for(i=0;i<20;i++){
        ADC_Value[i]=0;
    }
    DMADest   = &ADC_Value[0];        // DMA 目标地址
    DMASource = &AdcMirror.ADCRESULT0; // 源地址
    DMA_CH1_Init(DMADest,DMASource);

    while(1){
        DELAY_US(1000 * 1000);
        StartDMACH1();   // 假如DMA进入中断，则中断会将DmaRegs.CH1.CONTROL.bit.RUN位置零，下次转换需重新开启DMA
        AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;  // 软件使能ADC转换
        for(i=0;i<10;i++)
       {
        DELAY_US(1000);
        AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
       }

    }
}















